\documentclass[a4paper, 12pt]{article}
\usepackage[T2A]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[russian,english]{babel}
\usepackage[pdftex,unicode]{hyperref}
\usepackage[pdftex]{graphicx}

\begin{document}
Спецификация КОТ.
KOT - это IDE без буквы I, т.е. development envirement - набор утилит для разработки под mono второго порядка. Утилиты первого порядка - это компилятор, отладчик - они работают с байт-кодом. Результатом работы утилит второго порядка - исходный код на языке C\#.\\
Ядро кота - DOM - объектная модель документа (программы): все утилиты работают с DOM'ом - наполняют, модифицируют, транслируют, сериализируют, десериализируют...

KOT. Наполнение.
DOM очень удобно сравнить с базой данных, то есть мыслить как коллекцию простанств имен, классов, методов, выражений, которые состоят друг с другом в отношениях: принадлежности (класс A принадлежит пространству имен B) и наследования (класс A наследует интерфейс IA). 
Для изменения DB используется SQL, в нашем случае это будет $C^{\#}_{ut}$ , который имеет две формы:
\begin{itemize}
\item[Форма 1] - семантически соврадает с C\#, синтаксис похож на Ruby. С точки зрения DOM-как-DB программа на языке $C^{\#}_{ut}$ - дамп куска DOM, можно провести аналогию с хранением куска базы данных в формате CSV.
\item[Форма 2] - аналог SQL - основные комманды создать метод/пространство имен/класс, добавить в класс метод.
\end{itemize}
Итого форма 1 - это описание объекта a-la HTML, а форма 2 - инструкции по построению a-la SQL

КОТ. Трансляция.
Сохранение программы в .cs файлы и .build файл. Процесс однонаправленный, чем то напоминает компиляцию, только на выходе получает не байт-код, а код на языке C\#.

КОТ. Сериализация/десериализация.
Сохранение DOM в некий формат с последующем востановлением. Формат имеет две формы:
\begin{itemize}
\item["Проект-файл"] - весь DOM сохраняется в один файл. Таким образом этот формат удобен для человека: можно спокойно копировать этот файл, и нет опасности случайно удалить или забыть нужный для компиляции файл.
\item["Проект-помойка"] - каждому классу и каждому пространству имен соответсвует папка, отношение вложенности, передано через отношение вложенности в файловой системе. Информация об отношении наследования храниться в отдельном файле для каждого класса в соотведствующей ему папке. Каждый метод храниться в отдельном файле в папке класса, в котором он определен. Представление "проект-помойка" удобно для существующих систем контроля версий: благодаря данной структуре сериализованного DOM, легко транслировать сообщения об изменении файла в сообщения, вида "в классе A метод B был удален".
\end{itemize}

КОТ. Бифуркация.
Бифуркационными изменениями будем называть то, что в IntelliJ IDEA завется рефакторингом, то есть структурные изменения кода с сохранением функциональности. Автоматическое создание бифуркационных изменений возможно с помощью $C^{\#}_{ut}$ только в 2 форме.

КОТ. Макросы.
Текст на языке $C^{\#}_{ut}$ является программой на языке TCL, которая изменяет DOM так, как написано в тексте. Пример:\\
\begin{verbatim}
using System
namespace KOT
    class public Example
        constructor public {{}}
        end

        method public void Test
            call Console.WriteLine "qwerty"
        end
    end
end
\end{verbatim}
Таким образом в коде на $C^{\#}_{ut}$ можно делать вставки на TCL, которые в момент построения DOM будут выполнены и смогут изменить DOM. То есть можно вставлять макросы, подобные таковым, которые есть в nemerle и lisp.

Процесс создания программы:
\begin{enumerate}
	\item Программист создает пустой DOM
	\item Пишет небольшой кусок кода на $C^{\#}_{ut}$ и напоняет DOM
	\item Шаг 2 повторяется N раз
	\item Програмист осознает ошибки и изменяет DOM:
	\begin{itemize}
		\item Транслирует кусок DOM в $C^{\#}_{ut}$
		\item Изменяет код
		\item Запускает код и изменяет DOM
	\end{itemize}
	\item После того как что-то уже написано програмист производит бифуркационные изменения
	\item Шаг 2 повторяется N раз
	\item Трансляция DOM в проект на C\#
\end{enumerate}
\end{document}
